--- %%NOBANNER%% -->
![]() | ![]() |
/*------------------<-- Start of Description -->--------------------\ | THIS MACRO PERFORMS THE ARMITAGE TREND TEST FOR PROPORTIONS. | | WE ASSUME WE HAVE K PROPORTIONS P(I), I=1,2,..,K, OCCURRING IN | | K GROUPS WHICH ARE NATURALLY ORDERED(MILD, MODERATE, SEVERE SAY) | | EACH P(I)=n/N, WHERE n=NUMBER OF CASES OR EVENTS AND N=POPULA- | | TION SIZE IN GROUP I. ONE THEN ASSIGNS A NUMERIC SCORE, X(I), | | TO EACH OF THE K GROUPS, E.G. -1=MILD, 0=MODERATE, 1=SEVERE. | | THE TREND TEST IS A TEST OF THE SIGNIFICANCE OF THE REGRESSION | | OF P(I) ON X(I). | | | | THE INPUT DATASET MUST HAVE ONE ROW FOR EACH P(I). THE DATASET | | MUST CONTAIN VARIABLES FOR GROUP, X, n AND N. | |--------------------<-- End of Description -->---------------------| |--------------------------------------------------------------------| |--------------<-- Start of Files or Arguments Needed -->-----------| | Arguments: | | INDATA=INPUT DATASET NAME, ONE ROW PER GROUP. | | GROUP=THE GROUP VARIABLE(NUMERIC OR CHARACTER). | | THIS IS USED ONLY AS A LABEL OR IDENTIFIER. | | X=THE X VARIABLE FOR THE REGRESSION. | | CASE_N=THE VARIABLE CONTAINING THE NUMBER OF CASES | | (n) PER GROUP. | | N=THE POPULATION SIZE FOR THE GROUP. | | THE MACRO CREATES A NEW DATASET CALLED OUTDATA WHICH CONTAINS | | THE ORIGINAL DATASET PLUS TWO NEW VARIABLES, P(=n/N), AND | | PHAT, THE PREDICTED VALUE OF P FROM THE REGRESSION. A PLOT | | OF P VS PHAT MAY BE OF INTEREST. | | | | THE OUTPUT CONTAINS THREE SECTIONS. THE FIRST SECTION LABELED | | 'INPUT DATASET' LISTS THE INPUT DATA PLUS P AND PHAT. THE | | SECTION LABELED 'TEST STATISTICS' CONTAINS THE CHI-SQUARE, | | DF, AND P VALUES OF THE THREE TESTS. EQUATION 4 IS THE USUAL | | CHI-SQUARE TEST FOR A LINEAR TREND. THE SECTION LABELED | | 'REGRESSION STATISTICS' CONTAINS THE SLOPE ESTIMATE(B) AND ITS | | STANDARD ERROR AND ALSO THE INTERCEPT(A). EQUATION NUMBERS | | FROM THE ARMITAGE PAPER ARE INDICATED ON THE OUTPUT. | |---------------<-- End of Files or Arguments Needed -->------------| |--------------------------------------------------------------------| |----------------<-- Start of Example and Usage -->-----------------| | Usage: %TREND (INDATA, GROUP, X, CASE_N, N); | | REFERENCE: TESTS FOR LINEAR TRENDS IN PROPORTIONS & FREQUENCIES | | P. ARMITAGE, BIOMETRICS 1955,VOL(11),#3,375-385. | \-------------------<-- End of Example and Usage -->---------------*/ %MACRO TREND (INDATA, GROUP, X, CASE_N, N); /*--------------------------------------------\ | Author: JAMES KUIPER and BERGSTRALH; | | Date: 01/14/91; | | Purpose: ARMITAGE TREND TEST FOR PROPORTIONS| \--------------------------------------------*/ OPTIONS NOCENTER ERRORABEND; DATA _TREND1; LENGTH __GRP $ 8; SET &INDATA; KEEP DUM __GRP &X &CASE_N &N; DUM=1; __GRP=&GROUP; RENAME &X=__X &CASE_N=_CASE_N_ &N=_POP_N_; PROC SORT DATA=_TREND1; BY __X; DATA _TREND2; SET _TREND1; BY DUM; KEEP CASE_T POP_T P K DUM XBAR; RETAIN CASE_T 0 POP_T 0 P 0 NX 0; CASE_T = CASE_T + _CASE_N_; POP_T = POP_T + _POP_N_; NX = NX + (_POP_N_ * __X); IF LAST.DUM THEN DO; P = CASE_T / POP_T; K=_N_; XBAR = NX / POP_T; OUTPUT; END; DATA _TREND3; MERGE _TREND1 _TREND2; BY DUM; DROP __GRP _CASE_N_ _POP_N_ S_ SSX P_I __X; RETAIN S_ 0 SSX 0 S1_S2 0 S3 0; FORMAT P 10.8 B SE_B SE_B_ALT A BEST10.; P_I = _CASE_N_ / _POP_N_; S_ = S_ + _POP_N_*P_I*(__X-XBAR); SSX = SSX + _POP_N_*((__X-XBAR)**2); S1_S2 = S1_S2 + _POP_N_*((P_I-P)**2); S3 = S3 + _POP_N_*P_I*(1-P_I); S1_S2_S3 = POP_T*P*(1-P); IF LAST.DUM THEN DO; S1 = S_**2 / SSX; EQN3 = (S1_S2*POP_T) / S1_S2_S3; EQN3_DF = K-1; EQN3_P = 1-PROBCHI(EQN3,EQN3_DF); EQN3_P = ROUND(EQN3_P,.0001); EQN4 = (S1*POP_T) / S1_S2_S3; EQN4_DF = 1; EQN4_P = 1-PROBCHI(EQN4,1); EQN4_P = ROUND(EQN4_P,.0001); EQN3_4 = EQN3 - EQN4; EQN34_DF = K-2; EQN34_P = 1-PROBCHI(EQN3_4,EQN34_DF); EQN34_P = ROUND(EQN34_P,.0001); B = S_ / SSX; VAR_B = (P*(1-P)) / SSX; SE_B = SQRT(VAR_B); SE_B_ALT = SQRT(S3/((POP_T-K)*SSX)); CHISQ = B**2 / VAR_B; P_VALUE = 1-PROBCHI(CHISQ,1); P_VALUE = ROUND(P_VALUE,.0001); A = P - B*XBAR; OUTPUT; END; DATA NEXT; MERGE _TREND1 _TREND3; BY DUM; KEEP PHAT_I P_I __GRP __X _CASE_N_ _POP_N_ DUM; P_I = _CASE_N_ / _POP_N_; YHAT = A + B*__X; PHAT_I = YHAT; FORMAT P_I PHAT_I 10.8; DATA _NULL_; SET NEXT(IN=INA) _TREND3; BY DUM; FILE PRINT N=PS HEADER=H LINESLEFT=L; *** A ***; IF INA THEN DO; PUT @7 __GRP @18 __X @27 _CASE_N_ @37 _POP_N_ @47 P_I @63 PHAT_I; END; ELSE DO; PUT @5 '_____________________________________________' @50 '________________________' / ; PUT @25 't=' CASE_T @35 'T=' POP_T / @29 'OVERALL P(= t/T)= ' P; IF L LT 24 THEN PUT _PAGE_; *********; *** B ***; PUT //// @70 'ARMITAGE'; PUT @5 'TEST STATISTICS:' @39 'CHI SQUARE' @53 'DF' @59 'P VALUE' @70 'EQUATION' / ; PUT @10 'ALL GROUPS EQUAL' @41 EQN3 @53 EQN3_DF @59 EQN3_P @72 '(3)'; PUT @10 'LINEAR TREND' @41 EQN4 @53 EQN4_DF @59 EQN4_P @72 '(4)'; PUT @10 'DEPARTURES FROM LINEARITY' @41 EQN3_4 @53 EQN34_DF @59 EQN34_P @70 '(3)-(4)'; FORMAT EQN3 EQN4 EQN3_4 6.3; *********; *** C ***; PUT //// @5 'REGRESSION STATISTICS:' / ; PUT @10 'COEFFICIENT(B)' @37 '= ' B @72 '(5)'; PUT @10 'SE(B) UNDER NULL' @37 '= ' SE_B @70 'SQRT(6)'; PUT @10 'SE(B) UNDER ALTERNATIVES' @37 '= ' SE_B_ALT @70 'PG. 377'; PUT @10 'INTERCEPT(A)' @37 '= ' A /////; *********; END; RETURN; OPTIONS DQUOTE; H: IF INA THEN DO; PUT //// @5 "ARMITAGE TREND TEST FOR PROPORTIONS(BIOMETRICS" @52 "1955,VOL (II),#3,375-385)" // @5 "INPUT DATASET:" // @7 "&GROUP" @17 "&X" @27 "&CASE_N" @37 "&N" @51 "P" @66 "PHAT" / @17 "(X)" @27 "(n)" @37 "(N)" @49 "(n/N)" @62 "(PREDICTED P)" / ; END; OPTIONS NODQUOTE; PROC SORT DATA=&INDATA; BY &X; PROC SORT DATA=NEXT; BY __X; DATA OUTDATA; MERGE &INDATA NEXT(KEEP=P_I PHAT_I); RENAME P_I=P PHAT_I=PHAT; PROC DELETE DATA=_TREND1 _TREND2 _TREND3; RUN; %MEND TREND;